Skip to content

feat(types): declare the CEL envelope on visible / hidden / disabled as one shared ExpressionWire (objectui#7530, ruled A) - #7726

Merged
os-justin merged 4 commits into
mainfrom
claude/issue-7530-predicate-envelope-declared
Sep 5, 2026
Merged

feat(types): declare the CEL envelope on visible / hidden / disabled as one shared ExpressionWire (objectui#7530, ruled A)#7726
os-justin merged 4 commits into
mainfrom
claude/issue-7530-predicate-envelope-declared

Conversation

@os-justin

Copy link
Copy Markdown
Collaborator

Fixes #7530

Ruling executed — option A (maintainer 2026-09-04, decision batch #28; director comment 5536048209)

visible, hidden and disabled on BaseSchema declare boolean | ExpressionWire on both faces, where ExpressionWire is the EXISTING string-or-envelope union visibleWhen already used — hoisted into a shared module and reused by reference. No second envelope type; no per-key branch in hasDeclaredPredicate (packages/core/src/evaluator/declaredPredicate.ts is untouched).

The three keys, before → after (both faces)

key TS before (base.ts) TS after zod before (base.zod.ts) zod after
visible boolean | string (:281) boolean | ExpressionWire (:292) z.union([z.boolean(), z.string()]) (:158) z.union([z.boolean(), ExpressionWireSchema]) (:167)
hidden boolean | string (:359) boolean | ExpressionWire (:376) z.union([z.boolean(), z.string()]) (:188) z.union([z.boolean(), ExpressionWireSchema]) (:200)
disabled boolean | string (:385) boolean | ExpressionWire (:412) z.union([z.boolean(), z.string()]) (:203) z.union([z.boolean(), ExpressionWireSchema]) (:219)

ExpressionWire is string | { dialect?: string; source: string } — in words: a string, or an object with an optional string dialect and a required string source. (Generic-shaped spellings such as the zod input helper are written out in words in this body because GitHub strips tag-shaped fragments on save.)

The hoist — one wire type across the platform

  • packages/types/src/zod/expression.zod.ts (new): ExpressionWireSchema, moved out of zod/form.zod.ts where it was a module-private const; base.zod.ts and form.zod.ts import it. form.zod.ts is touched ONLY at its top region (the const and its import line) — finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers #6938's dev edits the CheckboxSchema block of the same file this batch.
  • packages/types/src/expression.ts (new): the TS twin ExpressionWire; base.ts imports it.
  • Exported: ExpressionWire from the main entry, ExpressionWireSchema from @object-ui/types/zod. The census in zod-mirror-parity.test.ts gains an EXCLUSIONS row for the new const (a union, no .shape).
  • Reuse is pinned by REFERENCE, not by shape: BaseSchema.shape.visible / .hidden / .disabled unwrap to a union whose object arm IS ExpressionWireSchema (identity, toBe), and so do FormFieldSchema.visibleWhen / visibleOn / readonlyWhen / requiredWhen and SelectOptionSchema.visibleWhen. A faithful copy passes every value comparison and is still the second envelope type the ruling forbids.

PM mechanism assumption — measured

hasDeclaredPredicatetoPredicateInput (packages/core/src/evaluator/predicateInput.ts) accepts an object with a string source and ANY dialect (absent or any string): only 'cel' keeps its envelope on the @objectstack/formula engine; every other dialect is unwrapped onto the legacy template path; an object without a string source is "no predicate". ExpressionWireSchema's object arm is { dialect: z.string().optional(), source: z.string() } — the same set. So the runtime accepts exactly the wire shape, not only { dialect: 'cel', source }; the declaration is neither wider nor narrower than the runtime. The dialect-less envelope is pinned on both faces (types: parses; react: renders identically).

Renderer identity — measured

packages/react/src/__tests__/SchemaRenderer.predicateEnvelopeDeclared.test.tsx (new; no casts, every schema typed BaseSchema): one predicate in three spellings — the ${...} template string, { dialect: 'cel', source: 'data.status == "draft"' }, and the dialect-less { source: '${...}' } — on each of the three keys, in both polarities (status is draft → holds; published is false → fails). Verdicts read side by side: visible/holds → rendered, visible/fails → not rendered; hidden/holds → not rendered, hidden/fails → rendered; disabled/holds → disabled forwarded as true, disabled/fails → nothing forwarded. One verdict per key and polarity across all three spellings, and the two polarities differ — so this is not three spellings agreeing on the evaluator's fail-soft constant. SchemaRenderer.hiddenDeclaredGate.test.tsx:188 (the envelope pin) now runs through renderDeclaredNode; the Record cast is gone.

ADR-0089 reading (objectstack docs/adr/0089-unify-visibility-predicate-naming.md)

Read in full for a string-only statement on predicate keys: there is none. D1 gives visibleWhen the spec's ExpressionInputSchema value, which IS the envelope. D4's carve-out — "the boolean visible (Tab on/off) is a different type and concept and is explicitly out of scope" — is about packages/spec/src/ui/view.zod.ts's visible: z.boolean() and, as #7455's triage established, does not bind objectui's BaseSchema. No conflict; nothing narrowed.

Docs

  • content/docs/api/schema-reference.md: the three rows read boolean \| string \| { dialect?, source } and name the envelope (the spelling the existing condition row already uses).
  • Component pages, by pin: button-group-doc-surface-6347.test.ts reads the zod mirror and compares it to button-group.mdx's inherited disabled row, and component-docs-disabled-inherited-7239.test.ts holds the other 13 inherited pages to that spelling — the first full packages/types/ run after the widening failed exactly those two 6347 cases (boolean | union vs boolean | string). declaredTypeText in the 6347 pin now flattens the nested union and spells the object arm; the 7239 literal moves to boolean | string | { dialect?, source }; 27 rows on 25 pages (14 inherited disabled, 13 inherited visible) plus span.mdx / page.mdx (doc-local names whose shipped TextSpanSchema / PageNodeSchema extend BaseSchema) carry the new spelling. Left as is: layout/semantic.mdx:63 (SemanticSchema is doc-local, no shipped interface to check inheritance against) and the two content/docs/core rows on other surfaces — both recorded in the finding below.

Changeset / tier

.changeset/7530-predicate-envelope-declared.md@object-ui/types: minor (accept set widens by an already-shipping shape; two new exported names). CONTRACT_REVIEW_TIER: needs:contract-review applied; PR stays draft. No skip-changeset — a phantom label in this repo.

Red-first and reverse verification

  • Red-first, on the untouched f96a781 tree with the new types pin in place: vitest 10 failed / 21 passed (six envelope-parse cases, three by-reference identities, the form-leg identity); tsc -p tsconfig.test.json: TS2344 on the three key assertions and TS2322 on the four envelope fixtures, while the twin-parity and wire-shape assertions already compiled clean.
  • Post-commit reverse leg (HEAD 9ae4286; base.ts + base.zod.ts checked out from the BASE blob f96a781, trap-restored with git checkout HEAD --): vitest 9 failed / 22 passed — the form-leg identity stays green because form.zod.ts was not reverted, which is the hoist being real; tsc 17 errors across the new pin and the six widened pins; restore proven by git diff HEAD = 0 lines and blob-hash equality (base.ts 32f9784f, base.zod.ts 9a58c0d7); green leg after restore 31/31.
  • React reads the REBUILT .d.ts: @object-ui/types was rebuilt before @object-ui/react type-check, and the new react pin (envelope literals in BaseSchema-typed schemas) compiles clean — the pre-widening .d.ts rejects those literals with TS2322, so a stale dist would have turned it red.

Gates (exit codes captured before any pipe; all at HEAD 9ae4286, single commit on f96a781)

command exit reading
pnpm --filter '@object-ui/react^...' build (baseline closure, before edits) 0 lock held 30s
pnpm --filter @object-ui/types build (after edits) 0 runs check-dist-completeness
pnpm exec vitest run --maxWorkers=2 packages/types/ 0 112 files, 1956 tests passed
pnpm exec vitest run --maxWorkers=2 packages/react/ 0 72 files, 861 tests passed
pnpm --filter @object-ui/types type-check 0 tsc --noEmit, examples, tsconfig.test.json
pnpm --filter @object-ui/core type-check 0
pnpm --filter @object-ui/react type-check 0
pnpm --filter @object-ui/types lint 0 0 errors, 269 pre-existing warnings (none on touched lines)
pnpm --filter @object-ui/react lint 0 0 errors, 347 pre-existing warnings
pnpm check:spec-symbols 0
pnpm check:control-bytes 0 6296 tracked text files
pnpm check:doc-types / pnpm check:doc-fences / pnpm docs:check-links 0 / 0 / 0 re-run after the docs sweep
pnpm check:unreferenced-sources 0 both new modules reachable
node scripts/check-changeset-presence.mjs / check-changeset-fixed.mjs / check-changeset-no-major.mjs 0 / 0 / 0 19 source files of 2 released packages, 1 changeset
pnpm check:doc-snippets 2 PRECONDITION NOT MET (unbuilt packages) — NOT MEASURED; this diff touches no ts / tsx fence (table cells and plaintext blocks only)

Declared narrowing: consumer packages beyond types / core / react were not type-checked locally (the full downstream sweep is 38 packages); CI's full type-check is the measurement. Consumers read the three keys through evaluateCondition / toPredicateInput / hasDeclaredVisibilityGate, all of which already accept the object arm.

Out of scope, filed

#7455 (landed as PR #7543) and #6938 are not addressed here. Refs: #7455 · #4581 · #4580 Q3-A · #7088. Session: https://claude.ai/code/session_01BAZFhALsQsGqxui8sNqM8s.


🤖 Generated with Claude Code

https://claude.ai/code/session_01BAZFhALsQsGqxui8sNqM8s


Generated by Claude Code

…bled` as one shared `ExpressionWire`

`BaseSchema.visible` / `.hidden` / `.disabled` go from `boolean | string` to
`boolean | ExpressionWire` on both faces, where `ExpressionWire` is
`string | { dialect?: string; source: string }` -- the string-or-envelope union
`FormField.visibleWhen` already carried, and the exact accept set of core's
`toPredicateInput` / `hasDeclaredPredicate`. The Zod mirror's
`z.union([z.boolean(), z.string()])` becomes
`z.union([z.boolean(), ExpressionWireSchema])` on all three keys.

The envelope was already an evaluated input on every key: `visible` is handed
to `evaluateCondition` as soon as it is declared, `hidden` / `disabled` ask
`hasDeclaredPredicate` first, and both routes honour `{ dialect: 'cel', source }`
(pinned through a `Record` cast in the hidden/disabled declared-gate tests).
Measured before this change on f96a781: `BaseSchema.safeParse({ type, hidden:
{ dialect: 'cel', source: 'true' } })` returned `success: false` with
`invalid_union` at path `hidden` while the identical envelope parsed on
`FormField.visibleWhen` one file over. Declared did not match enforced, on all
three keys.

One wire type, not three: `ExpressionWireSchema` is hoisted out of
`zod/form.zod.ts` (module-private there) into `zod/expression.zod.ts` and
imported by `base.zod.ts` and `form.zod.ts`; a TS twin `ExpressionWire` lives in
`expression.ts`. Both are exported. Reuse is pinned by reference, not by shape,
so a faithful copy cannot pass as the shared type. No per-key branch in the
shared evaluator (the rejected alternative).

Pins: a new types pin holds all three keys to `boolean | ExpressionWire |
undefined` invariantly, the TS/zod twins equal, the object arm identical by
reference on every key and on the form legs, and the envelope parsing (with and
without `dialect`) beside the refusals; a new react pin renders the `${...}`
string, the `cel` envelope and the dialect-less envelope of one predicate on
each key, in both polarities, and asserts one verdict per key. The hidden
declared-gate envelope pin drops its `Record` cast. Six pins that asserted the
old union exactly widen with it.

Docs: the three schema-reference rows name the envelope, and the component
pages' inherited `disabled` / `visible` rows spell the same flat union -- the
6347 pin reads the mirror through the nested union and the 7239 pin holds the
14 inherited `disabled` pages to that spelling.

Ruled by the maintainer on 2026-09-04, objectui#7530 option A.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BAZFhALsQsGqxui8sNqM8s
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3186.2 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-Dzum-j3t.js
Status PASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 510.70KB 116.21KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 180.00KB 50.20KB
fields (index.js) 242.27KB 61.22KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.98KB 10.98KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 47.87KB 13.31KB
plugin-charts (index.js) 70.92KB 19.75KB
plugin-chatbot (index.js) 196.37KB 46.41KB
plugin-dashboard (index.js) 132.87KB 34.68KB
plugin-designer (index.js) 212.86KB 43.19KB
plugin-detail (index.js) 250.55KB 64.06KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.26KB 41.00KB
plugin-grid (index.js) 209.29KB 56.78KB
plugin-kanban (index.js) 52.71KB 14.55KB
plugin-list (index.js) 113.28KB 27.59KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.59KB 11.97KB
plugin-timeline (index.js) 30.84KB 8.85KB
plugin-tree (index.js) 9.20KB 3.19KB
plugin-view (index.js) 85.24KB 20.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Copy link
Copy Markdown
Collaborator Author

Merged origin/main adb2a86 (#6854's landing, PR #7720packages/types/src/app.ts / app.zod.ts / runner; no file overlap with this diff) into the branch after the PR opened: merge commit 649c920, pushed. The body's gates table reads at 9ae4286; the same set re-run on the merged head 649c920, exit codes captured before any pipe:

command exit reading
pnpm --filter @object-ui/types build 0
pnpm exec vitest run --maxWorkers=2 packages/types/ 0 113 files, 1962 tests passed (the six new ones are #6854's)
pnpm exec vitest run --maxWorkers=2 packages/react/ 0 72 files, 861 tests passed
pnpm --filter @object-ui/types type-check / @object-ui/core type-check 0 / 0
pnpm --filter '@object-ui/react^...' build then pnpm --filter @object-ui/react type-check 0 / 0 the closure rebuild first: the worktree had been removed and re-created, so react's dependency dist/ was absent (TS2307 on @object-ui/core, a precondition, not a verdict)
pnpm check:spec-symbols / check:control-bytes / check:doc-types / check:doc-fences / docs:check-links / check:unreferenced-sources 0 ×6
node scripts/check-changeset-presence.mjs / -fixed / -no-major 0 / 0 / 0 19 source files of 2 released packages, 1 changeset

Labels read back after the write: package: types, package: react, tests, needs:contract-review. Draft stays draft (contract-review tier). Session: https://claude.ai/code/session_01BAZFhALsQsGqxui8sNqM8s.


Generated by Claude Code

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3186.2 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-Dzum-j3t.js
Status PASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 510.70KB 116.21KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 180.00KB 50.20KB
fields (index.js) 242.27KB 61.22KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.98KB 10.98KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 47.87KB 13.31KB
plugin-charts (index.js) 70.92KB 19.75KB
plugin-chatbot (index.js) 196.37KB 46.41KB
plugin-dashboard (index.js) 132.87KB 34.68KB
plugin-designer (index.js) 212.86KB 43.19KB
plugin-detail (index.js) 250.55KB 64.06KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.26KB 41.00KB
plugin-grid (index.js) 209.29KB 56.78KB
plugin-kanban (index.js) 52.71KB 14.55KB
plugin-list (index.js) 113.28KB 27.59KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.59KB 11.97KB
plugin-timeline (index.js) 30.84KB 8.85KB
plugin-tree (index.js) 9.20KB 3.19KB
plugin-view (index.js) 85.24KB 20.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Copy link
Copy Markdown
Collaborator Author

Provenance for clearing needs:contract-review on this PR (2026-09-05T12:21Z): in-seat contract review at CONTRACT_REVIEW_TIER returned PASS on the card — #7530 (comment) (Implemented-by: branch claude/issue-7530-predicate-envelope-declared; Reviewed-by: session_01BAZFhALsQsGqxui8sNqM8s, served tier claude-fable-5-1 re-read at 12:17Z). Head reviewed: 649c920 (read by ref against origin/main 446d93d). The card side never carried the label, so the PR carrier is the only one to strip; the strip is a whole-set label write (package: types, package: react, tests) with read-back in the same stroke as this comment. If the head moves past 649c920, the label is re-hung and the review re-done. Ready + auto-merge follow once every check on this head is green.


Generated by Claude Code

… every row this branch touched

`{ dialect?, source }` is not TypeScript: `box.mdx` fences its schema block
`ts`, `check:doc-snippets` compiles it against the built `@object-ui/types`
dist, and CI reported TS7008 on `dialect` and `source` at `box.mdx:50` (the one
touched row inside a `ts` fence; the other 26 pages fence `plaintext` /
`text`, and the schema-reference rows are table cells). One spelling for every
row this branch touched rather than one per fence language:
`{ dialect?: string; source: string }` -- valid inside a `ts` fence and a
faithful reading of the mirror's object arm.

29 component rows on 27 pages and the three `schema-reference.md` rows move to
it. `declaredTypeText` in `button-group-doc-surface-6347.test.ts` now prints
the object arm with each member's type (`?` on the optional wrapper), and the
`component-docs-disabled-inherited-7239.test.ts` literal follows; both pins'
row regexes now run to the `;` that ends the row instead of the first `;`,
which the inline object type carries between its members.

Nothing else moves; the untouched `condition` row keeps its own spelling.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BAZFhALsQsGqxui8sNqM8s

Copy link
Copy Markdown
Collaborator Author

Patch round 1 (PM seat, 2026-09-05T12:34Z) — CI Doc Snippet Type Check red on 649c920 (job 101304609121): box.mdx:50 TS7008 on dialect / source.

Cause, measured. Of the 32 rows this branch touched, exactly one sits inside a ts fence (content/docs/components/layout/box.mdx:50); 26 sit in plaintext fences, 2 in text fences (file-upload.mdx), 3 are schema-reference.md table cells. { dialect?, source } is not TypeScript (members without types), and check:doc-snippets compiles ts / tsx fences against the built @object-ui/types dist — so one block failed and the body's "touches no ts/tsx fence" was wrong for that page.

Fix, one commit a415c0c0, one spelling. Every row this branch touched now reads { dialect?: string; source: string } — valid inside a ts fence and a faithful reading of the mirror's object arm ({ dialect: z.string().optional(), source: z.string() }): 29 component rows on 27 pages (incl. span.mdx / page.mdx) and the three schema-reference.md rows. declaredTypeText in button-group-doc-surface-6347.test.ts prints the object arm with each member's type (? from the optional wrapper), the component-docs-disabled-inherited-7239.test.ts literal follows, and both pins' row regexes now run to the ; that ends the row (the inline object type carries its own ; between members; a first-; capture would have truncated it). The untouched condition row keeps its own spelling. No per-fence spelling was needed.

Merged origin/main b74a859 first (#7718, #7723#7723's CheckboxSchema block in form.zod.ts is a different region from the top-region hoist; clean merge, nothing resolved by hand): merge commit bfea92e8, then a415c0c0, pushed.

Gates on head a415c0c0, exit codes captured before any pipe:

command exit reading
pnpm exec turbo run build $(node scripts/check-doc-snippet-types.mjs --build-filter) --concurrency=2 (verify lock) 0 34 successful, 34 total, 3m58s — the closure the gate resolves against (--filter '@object-ui/react^...' was not enough)
node scripts/check-doc-snippet-types.mjs 0 Syntax phase: every block parsed; Semantic phase: 456 of 456 block(s) judged, 0 failed. — MEASURED this time
pnpm exec vitest run --maxWorkers=2 packages/types/ (verify lock) 0 115 files, 1991 tests passed (both docs pins included)
pnpm check:doc-types / check:doc-fences / docs:check-links / check:control-bytes 0 / 0 / 0 / 0
node scripts/check-changeset-presence.mjs / -fixed / -no-major 0 / 0 / 0 19 source files of 2 released packages, 1 changeset

Not re-run this round (the patch is docs plus two types tests, no package source): the packages/react/ suite and the three type-check scripts; the closure build above ran every package's tsc build, which is not the same instrument. Labels re-attached as the union of the current set plus needs:contract-review; read back in the report. Draft stays draft. Session: https://claude.ai/code/session_01BAZFhALsQsGqxui8sNqM8s.


Generated by Claude Code

Copy link
Copy Markdown
Collaborator Author

Provenance for clearing needs:contract-review on this PR again (2026-09-05T12:46Z, head a415c0c0): in-seat contract review at CONTRACT_REVIEW_TIER returned PASS (delta, patch round 1) on the card — #7530 (comment) (Implemented-by: branch claude/issue-7530-predicate-envelope-declared; Reviewed-by: session_01BAZFhALsQsGqxui8sNqM8s, served tier claude-fable-5-1 re-read at 12:44Z). The patch commit touches no contract file (verified by ref); the first PASS (5551770555, head 649c920) stands for the contract increment. Whole-set label write (package: types, package: react, tests) with read-back in the same stroke as this comment. If the head moves past a415c0c0, the label is re-hung and the delta re-reviewed. Ready + auto-merge follow once every check on this head is green.


Generated by Claude Code

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3186.4 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-mYjv8wWM.js
Status PASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 510.70KB 116.21KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 180.00KB 50.20KB
fields (index.js) 242.27KB 61.22KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.98KB 10.98KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 47.87KB 13.31KB
plugin-charts (index.js) 70.92KB 19.75KB
plugin-chatbot (index.js) 196.37KB 46.41KB
plugin-dashboard (index.js) 132.87KB 34.68KB
plugin-designer (index.js) 212.86KB 43.19KB
plugin-detail (index.js) 250.55KB 64.06KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.26KB 41.00KB
plugin-grid (index.js) 209.29KB 56.78KB
plugin-kanban (index.js) 52.71KB 14.55KB
plugin-list (index.js) 113.28KB 27.59KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.59KB 11.97KB
plugin-timeline (index.js) 30.84KB 8.85KB
plugin-tree (index.js) 9.20KB 3.19KB
plugin-view (index.js) 85.24KB 20.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants